using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace IFIGame
{

    public class Game1 : Microsoft.Xna.Framework.Game
    {
        MouseState ms;
        BonJoueur joueur;
        bool veut_lancer = false;
        bool want_kill = false;
        BonJoueur bonJoueur;
        Movable profs;
        int nbMauvaisJoueur;
        List<MauvaisJoueur> listMauvaisJoueur;
        MauvaisJoueur mauvaise_joueur;
        Random rnd;
        Environnement environnement;

        List<Livre> livres;
        Livre livre_lancer;
        const int MAX_NB_LIVRE = 100;
        List<Livre> _livres;
        Vie viePlace;


        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
       // Movable example;


        public void loadGraphic()
        {
            graphics = new GraphicsDeviceManager(this);
            this.graphics.PreferredBackBufferWidth = 800;
            this.graphics.PreferredBackBufferHeight = 600;
            this.graphics.ApplyChanges();
        }

        public Game1()
        {
            this.loadGraphic();
            Content.RootDirectory = "Content";
        }

        protected override void Initialize()
        {
            rnd = new Random();
            this.IsMouseVisible = true;
            environnement = new Environnement(this);
            Components.Add(environnement);

            viePlace = new Vie(this, 200, 270, "Textures/coeur");
            Components.Add(viePlace);

            this.joueur = new BonJoueur(this, environnement.getListObstacle(), 100, 100, 3, "Textures/bonjoueur");
            _livres = new List<Livre>(MAX_NB_LIVRE);
            Components.Add(joueur);
            
            livres = new List<Livre>(MAX_NB_LIVRE);
            for (int i = 0; i < MAX_NB_LIVRE; i++)
            {
                livres.Add(new Livre(this, rnd.Next(1,500), rnd.Next(1,500), 3, "Textures/livreNew"));
                Components.Add(this.livres[i]);
            }

            this.bonJoueur = new BonJoueur(this,environnement.getListObstacle(), 0, 0, 3, "Textures/bonJoueur");
            Components.Add(bonJoueur);
            nbMauvaisJoueur = 6;
            listMauvaisJoueur = new List<MauvaisJoueur>(nbMauvaisJoueur);
            listMauvaisJoueur.Add(new MauvaisJoueur(this, 40, 40, 3, "Textures/mauvaisJoueur"));
            Components.Add(listMauvaisJoueur.ElementAt(0));
            listMauvaisJoueur.Add(new MauvaisJoueur(this, 220, 30, 3, "Textures/mauvaisJoueur"));
            Components.Add(listMauvaisJoueur.ElementAt(1));
            listMauvaisJoueur.Add(new MauvaisJoueur(this, 230, 500, 3, "Textures/mauvaisJoueur"));
            Components.Add(listMauvaisJoueur.ElementAt(2));
            listMauvaisJoueur.Add(new MauvaisJoueur(this, 420, 420, 3, "Textures/mauvaisJoueur"));
            Components.Add(listMauvaisJoueur.ElementAt(3));
            listMauvaisJoueur.Add(new MauvaisJoueur(this, 460, 30, 3, "Textures/mauvaisJoueur"));
            Components.Add(listMauvaisJoueur.ElementAt(4));
            listMauvaisJoueur.Add(new MauvaisJoueur(this, 650, 300, 3, "Textures/mauvaisJoueur"));

            profs = new Movable(this, 800, 600, 0, "Textures/mauvaisJoueur");
//            mauvaise_joueur = new MauvaisJoueur(this);

            base.Initialize();
        }

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
        }

        protected override void UnloadContent()
        {
        }
       
        protected override void Update(GameTime gameTime)
        {           
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
            ms = Mouse.GetState();

            for (int i = 0; i < livres.Count; i++)
            {
                Livre _livre = livres[i];
                bool is_pris = joueur.prendLivre(_livre);
                if (is_pris)
                {
                    Components.Remove(_livre);
                    livres.RemoveAt(i);
                }
            }
 
            //verifier place du coeur
            if (this.joueur.checkCollision(viePlace.toRectangle()) == true)
            {
                this.joueur.addNbVie(1);
                Components.Remove(viePlace);
                //viePlace = new Vie(this, 200, 270, "Textures/coeur");
                //Components.Add(viePlace);
            }

             for (int i = 0; i < nbMauvaisJoueur; i++)
             {
                if (joueur.getNbLivre() > 0 && ms.LeftButton == ButtonState.Pressed && 
                    listMauvaisJoueur[i].checkInRect(ms.X, ms.Y))
                {
                    veut_lancer = true;
                    livre_lancer = joueur.getLivreAt(0);
                    Components.Remove(joueur.getLivreAt(0));
                    joueur.removeLivreAt(0);
                    Components.Add(livre_lancer);
                    mauvaise_joueur = listMauvaisJoueur[i];
                    Components.Remove(listMauvaisJoueur[i]);
                    listMauvaisJoueur.RemoveAt(i);
                    Components.Add(mauvaise_joueur);
                    nbMauvaisJoueur--;
                    break;
                }
             }

            if (veut_lancer && !want_kill)
            {
                want_kill = true;    
            }
            if(want_kill)
            {
                for (int i = 0; i < environnement.getListObstacle().Count; i++)
                {
                    if (livre_lancer.checkCollision(environnement.getListObstacle()[i].getRectangle()))
                        livre_lancer.setCompetence(0);
                }
                joueur.lancerLivre(livre_lancer, mauvaise_joueur);
                if (livre_lancer.getCompetence() <= 0 ||
                mauvaise_joueur.checkCollision(livre_lancer.getRectangle()))
                {
                    if (mauvaise_joueur.checkCollision(livre_lancer.getRectangle()))
                    {
                        Components.Remove(mauvaise_joueur);
                    }
                    else
                    {
                        listMauvaisJoueur.Add(mauvaise_joueur);
                        nbMauvaisJoueur++;
                        Components.Remove(mauvaise_joueur);
                        Components.Add(listMauvaisJoueur[nbMauvaisJoueur-1]);
                    }
                    Components.Remove(livre_lancer);
                    want_kill = false;
                    veut_lancer = false;
                }
            }
            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
            base.Draw(gameTime);
        }

        public int getDirectionCollision()
        {
            int direction = 0;
            foreach (Obstacle obstacle in this.environnement.getListObstacle())
            {
                if (this.joueur.checkCollisionYDown(obstacle.getRectangle()) == true)
                {
                    return 2;
                }
                if (this.joueur.checkCollisionYUp(obstacle.getRectangle()) == true)
                {
                    return 0;
                }
                if (this.joueur.checkCollisionXRight(obstacle.getRectangle()) == true)
                {
                    return 1;
                }
                if (this.joueur.checkCollisionXLeft(obstacle.getRectangle()) == true)
                {
                    return 3;
                }
            }
            return direction;
        }


        // ===================== collision
        public bool getCollisionDown(int x,int y)
        {

            foreach (Obstacle obstacle in this.environnement.getListObstacle())
            {
                Rectangle joueurRectangle= this.joueur.getRectangle( x,  y);
                if (joueurRectangle.Intersects(obstacle.getRectangle()))
                        return true;
            }
            
            return false; 
        }

        public void RendreDevoir()
        {
            if (this.joueur.checkCollision(profs.getRectangle()) == true)
                this.Components.Remove(joueur);
        }
    }
}
